<template>
  <div class="person">
    <h1>情况二：监视【ref】定义的【对象类型】数据</h1>
    <h2>姓名：{{ person.name }}</h2>
    <h2>年龄：{{ person.age }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改整个人</button>
  </div>
  
</template>



<script lang="ts" setup name="Person">
import {ref, watch} from 'vue'

let person = ref({
  name: '张三',
  age: 20,
})

function changeName() {
  person.value.name += "~"
}
function changeAge() {
  person.value.age += 1
}

function changePerson() {
  person.value = {name: '李四', age: 25} // 属性得写全，否则会报错
}


// 监听
// 情况二：监视【ref】定义的【对象类型】数据，监视的是对象的地址值，若想监视对象内部属性的变化，需要手动开启深度遍历
// watch的第一个参数：被监视的数据
// watch的第二个参数：监视的回调
// watch的第三个参数：配置对象（deep、immediate等）
// 注意，若修改的ref定义的对象中的属性，newValue和oldValue都是新值，因为它们是同一个对象；若修改整个ref定义的对象，newValue是新值，oldValue是旧值，因为不是同一个对象了。
watch(person, (newVal, oldVal) => {
  console.log('监听到数据变化：', newVal, oldVal)
  
}, {
  deep: true, // 开启深度遍历
  immediate: true // 立即执行一次回调函数
})

</script>

<style scoped>
.person {
  background-color: skyblue;
  box-shadow: 0 0 10px;
  border-radius: 10px;
  padding: 20px
}

button {
  margin: 0 5px;
}
li {
  font-size: 20px;
}
</style>